package api

import (
	"net/http"
	"strconv"
	"vblog/apps/blog"
	"vblog/apps/user"
	"vblog/common"
	"vblog/logger"

	"github.com/gin-gonic/gin"
)

func (h Handler) CreateBlog(c *gin.Context) {

	// 获取用户信息
	v, ok := c.Get(user.REQUEST_CTX_TOKEN_KEY)
	if !ok {
		common.SendFaild(c, common.NewUnauthorized())
		return
	}

	// 中间件逻辑:
	// u, err := usvc.ValidateToken(c.Request.Context(), user.NewValidateTokenRequest(tk))
	// if err != nil {
	// 	common.SendFaild(c, err)
	// 	return
	// }
	// // 3. 把User对象放到ctx中(请求上下文), 后面CreateBlog需要从上下文中获取用户的身份信息.
	// c.Set(user.REQUEST_CTX_USER_KEY, u)
	u := v.(*user.Token)
	logger.L().Debug().Msgf("loggin user: %s", u)

	// 初始化一个请求对象
	in := blog.NewCreateBlogRequest()
	err := c.BindJSON(in)
	if err != nil {
		// 如何统一处理异常? 我们的接口如何进行统一处理:
		// 正常应该返回什么数据?
		// 异常应该返回什么数据?
		common.SendFaild(c, err)
		// common.SendFaild(c, http.StatusBadRequest, http.StatusBadRequest, err.Error())
		// c.AbortWithError(http.StatusOK, err)
		return
	}

	in.Author = u.Username

	// 处理用户的请求
	// 调用业务逻辑来处理业务逻辑
	ins, err := h.svc.CreateBlog(c.Request.Context(), in)
	if err != nil {
		common.SendFaild(c, err)
		c.AbortWithError(http.StatusOK, err)
		return
	}
	c.JSON(http.StatusOK, ins)
}

func (h Handler) QueryBlog(c *gin.Context) {
	// 初始化一个请求对象
	in := blog.NewQueryBlogRequest()
	// 请求参数 就是http querystring, url参数

	// in.PageSize, _ = strconv.Atoi(c.DefaultQuery("page_size", "20"))
	// in.PageNumber, _ = strconv.Atoi(c.DefaultQuery("page_number", "1"))

	// 默认参数覆盖问题
	ps := c.Query("page_size")
	if ps != "" {
		in.PageSize, _ = strconv.Atoi(ps)
	}
	pn := c.Query("page_number")
	if pn != "" {
		in.PageNumber, _ = strconv.Atoi(pn)
	}
	in.Author = c.Query("author")
	in.Keywords = c.Query("keywords")

	// 处理用户的请求
	// 调用业务逻辑来处理业务逻辑
	ins, err := h.svc.QueryBlog(c.Request.Context(), in)
	if err != nil {
		common.SendFaild(c, err)
		return
	}
	c.JSON(http.StatusOK, ins)
}

func (h Handler) DescribeBlog(c *gin.Context) {
	req := &blog.DescribeBlogRequest{
		Id: c.Param("id"),
	}
	ins, err := h.svc.DescribeBlog(c.Request.Context(), req)
	if err != nil {
		common.SendFaild(c, err)
		return
	}
	c.JSON(http.StatusOK, ins)
}

func (h Handler) UpdateBlog(c *gin.Context) {
	req := blog.NewUpdateBlogRequest(c.Param("id"))
	// 保存作者
	v, ok := c.Get(user.REQUEST_CTX_TOKEN_KEY)
	if !ok {
		common.SendFaild(c, common.NewUnauthorized())
		return
	}
	u := v.(*user.Token)
	req.Author = u.Username

	err := c.BindJSON(req.CreateBlogRequest)
	if err != nil {
		common.SendFaild(c, err)
		return
	}
	ins, err := h.svc.UpdateBlog(c.Request.Context(), req)
	if err != nil {
		common.SendFaild(c, err)
		return
	}
	c.JSON(http.StatusOK, ins)
}
func (h Handler) DeleteBlog(c *gin.Context) {
	req := blog.NewDeleteBlogRequest(c.Param("id"))
	ins, err := h.svc.DeleteBlog(c.Request.Context(), req)
	if err != nil {
		common.SendFaild(c, err)
		return
	}
	c.JSON(http.StatusOK, ins)
}
